package cliente;
import comum.*;
import java.rmi.RemoteException;
import java.util.HashSet;
import java.util.Set;

public class RN_Partida {
    // Inicialização de instância única de RN_Partida
    private static final RN_Partida theRN_Partida = new RN_Partida();
    private RN_Mesa mesa;

    // Construtor privado
    private RN_Partida(){
        this.mesa = new RN_Mesa();
    }

    // Ponto de acesso à instância única
    public static RN_Partida getRN_Partida(){
        return theRN_Partida;
    }

    public RN_Mesa getMesa(){
        /* Chamado por: IU_Jogo, VF1
         * Caso de uso: Atualizar Mesa */
        return this.mesa;
    }

    public Boolean validarSelecao(Set<RN_Carta> selecao){
        if(selecao.size()==0) return true;
        if(!isSelecaoIgual(selecao)) return false;
        if(getMesa().getUltimoDescarte().size()==0) return true;
        if(selecao.size()!=getMesa().getUltimoDescarte().size()) return false;
        return comparaElemento(selecao);
     
    }

    private Boolean isSelecaoIgual(Set<RN_Carta> selecao){
        int valors=0;
        for(RN_Carta s : selecao) {valors=s.getValor(); break;}       
        for(RN_Carta s : selecao){if(s.getValor()!=valors) return false;}
        return true;
    }
    
    private Boolean comparaElemento(Set<RN_Carta> selecao){
        if(((RN_Carta) selecao.toArray()[0]).getValor()<=((RN_Carta)getMesa().getUltimoDescarte().toArray()[0]).getValor()) return false;
        return true;
    }
    
    public void fazerJogada(Set<RN_Carta> selecao) throws RemoteException{
        /* Chamado por: IU_Jogo, VF1
         * Caso de uso: Fazer Jogada, VF1 */
        RN_Jogador.getRN_Jogador().getMaoDeCartas().removeAll(selecao); // ou definir atualizar.. como estatico?
        HashSet<CartaComum> selecaoCartaComum = new HashSet<CartaComum>();
        for(RN_Carta carta : selecao) selecaoCartaComum.add(new CartaComum(carta.getNaipe(),carta.getValor()));
        SO_PresidenteCliente.getSO_PresidenteCliente().fazerJogada(selecaoCartaComum);        
    }
    
//    public Set<String> obterJogadoresParticipantes(){
//        //return RN_PartidaVF2.getRN_Partida().obterJogadoresParticipantes;
//        return SO_PresidenteCliente.getSO_PresidenteCliente().obterJogadoresParticipantes();
//    }
    public void atualizarMesa(Mesa mesa){
        /* Chamado por: RN_Partida, VF2
         * Caso de uso: Iniciar Partida */
        this.mesa.carregaMesaComumEmRN_Mesa(mesa);
    }
    
    public void terminarPartida(Mesa mesa){
        /* Chamado por: RN_Partida, VF2
         * Caso de uso: Terminar partida */
        this.atualizarMesa(mesa);
    }
}
